/**
 * @file u8g2.cpp
 * @brief OLED显示屏控制模块实现
 */

#include "../include/display.h"
#include <U8g2lib.h>
#include <Wire.h>
#include "../include/led.h"
#include "../include/menu.h"
#include "../include/config.h"
#include "esp_heap_caps.h"
#include "../include/mcu_led.h"
#include <algorithm> // 添加算法头文件，用于std::min

// 声明函数，防止未声明错误
void drawMenuList(uint8_t firstIdx, uint8_t lastIdx, uint8_t selectedIdx);
void drawParamPage(const char *title, int value, const char *unit, uint8_t percent);
void showParamPage(uint8_t menuIdx);

#define MENU_ITEMS_COUNT 39 // 更新菜单项总数：修正为39（0-38索引，共39项，包含峰值点配置）
#define DISPLAY_START_Y 18        // 起始Y坐标(像素)
#define DISPLAY_LINE_HEIGHT 20    // 行距(像素)
#define DISPLAY_MAX_LINES 3       // 最大显示行数
#define DISPLAY_LEFT_MARGIN 5     // 左边距(像素)
#define DISPLAY_HIGHLIGHT_PAD 5   // 选中项高亮框左右边距(像素)
#define DISPLAY_HIGHLIGHT_H 18    // 选中项高亮框高度(像素) - 增加2像素
#define HIGHLIGHT_TOP_OFFSET -15   // 高亮框垂直偏移量(负值表示上移)
#define HIGHLIGHT_HEIGHT_EXTRA 10 // 高亮框高度增加值(在字体高度基础上增加)

// 创建中文字体显示对象
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);

// OLED显示屏初始化状态标志 - 移除static，使其可以被外部访问
bool g_displayInitialized = false;

// 显示安全检查宏
#define DISPLAY_SAFE_GUARD()   \
    if (!g_displayInitialized) \
    {                          \
        return;                \
    }

// 当前显示页面
DisplayPage currentPage = PAGE_MAIN;

// 子菜单可见项起始位置
uint8_t firstVisibleSubMenuItem = 0;

// LED效果名称数组 (与LED_MODE_*枚举值对应)
const char *effectNames[] = {
    "纯色模式", // LED_MODE_SOLID (0)
    "彩虹模式", // LED_MODE_RAINBOW (1)
    "瀑布模式", // LED_MODE_WATERFALL (2)
    "频谱模式", // LED_MODE_SPECTRUM (3)
    "火焰模式"  // LED_MODE_FIRE (4)
};

// 颜色方案名称数组
const char *colorNames[] = {
    "彩虹色",
    "火焰色",
    "海洋色",
    "森林色",
    "派对色",
    "单色",
    "渐变色" // 新增渐变色
};

// 设置菜单项名称数组
const char *settingsMenuItems[] = {
    "效果选择",
    "颜色选择",
    "亮度调节",
    "音频灵敏度",
    "灯带模式",
    "灯带分段",
    "每段灯数",
    // 新增频谱平滑处理参数菜单项
    "频谱平滑",
    "上升速度",
    "下降速度",
    "峰值衰减",
    // 新增峰值点参数菜单项
    "峰值点衰减",
    "峰值点停留",
    "冲击速度",
    "冲击距离",
    "颜色循环",
    "对数尺度",
    "快速衰减",
    // ==================== 新增频率补偿参数菜单项 ====================
    "低频补偿",   // 18 - 低频补偿系数(0-29频段: 20Hz-200Hz)
    "中频补偿",   // 19 - 中频补偿系数(30-69频段: 200Hz-2kHz)
    "中高频补偿", // 20 - 中高频补偿系数(70-109频段: 2kHz-10kHz)
    "高频补偿",   // 21 - 高频补偿系数(110-119频段: 10kHz-20kHz)
    // ==================== 新增分频段噪声阈值菜单项 ====================
    "低频噪声",   // 22 - 低频噪声阈值(0-29频段: 20Hz-200Hz)
    "中频噪声",   // 23 - 中频噪声阈值(30-69频段: 200Hz-2kHz)
    "中高频噪声", // 24 - 中高频噪声阈值(70-109频段: 2kHz-10kHz)
    "高频噪声",   // 25 - 高频噪声阈值(110-119频段: 10kHz-20kHz)
    // ==================== 新增频谱压缩比例菜单项 ====================
    "频谱压缩", // 26 - 频谱压缩比例(80%-98%, 控制动态范围压缩)

    // ==================== 新增动态频段分配菜单项 ====================
    "低频频段",   // 27 - 低频频段数量(1-30, 控制20Hz-200Hz分配)
    "中频频段",   // 28 - 中频频段数量(1-40, 控制200Hz-2kHz分配)
    "中高频频段", // 29 - 中高频频段数量(1-50, 控制2kHz-10kHz分配)
    "高频频段",   // 30 - 高频频段数量(1-50, 控制10kHz-20kHz分配)

    // ==================== 新增节拍检测菜单项 ====================
    "节拍灵敏度", // 31 - 节拍灵敏度(10-100, 控制节拍检测敏感度)
    "节拍阈值",   // 32 - 节拍阈值(0.1-2.0, 控制节拍检测阈值)
    "节拍衰减",   // 33 - 节拍衰减率(0.1-1.0, 控制节拍信号衰减)
    "节拍间隔",   // 34 - 最小节拍间隔(50-500ms, 防止过度触发)
    "节拍增强",   // 35 - 节拍增强因子(1.0-5.0, 控制视觉增强倍数)

    // ==================== 新增频率上限菜单项 ====================
    "频率上限", // 36 - 频率上限(10-48kHz, 控制频谱分析最高频率)

    // ==================== 新增峰值点配置菜单项 ====================
    "峰值点数量", // 峰值点数量配置
    "峰值点颜色", // 峰值点颜色配置
    "重置设置"};

/**
 * @brief 初始化OLED显示屏
 *
 * @return true 初始化成功
 * @return false 初始化失败
 */
bool initu8g2()
{
    // 初始化I2C
    Wire.begin(OLED_SDA_PIN, OLED_SCL_PIN);

    // 初始化U8g2显示
    u8g2.begin();
    u8g2.enableUTF8Print();
    u8g2.setFont(u8g2_font_wqy16_t_gb2312); // 使用文泉驿16点阵中文字体
    u8g2.setDrawColor(1);                   // 白色

    // 显示启动画面
    showSplashScreen(); // 调用显示启动画面函数

    if (DEBUG_SERIAL)
    {
        Serial.println("OLED显示屏初始化成功!");
    }

    return true;
}

/**
 * @brief 初始化OLED显示屏
 *
 * @return true 初始化成功
 * @return false 初始化失败
 */
bool initDisplay()
{
    // 增加延迟，确保硬件稳定
    delay(100);

    // 初始化I2C，增加时钟频率设置
    Wire.begin(OLED_SDA_PIN, OLED_SCL_PIN);
    Wire.setClock(100000); // 设置为100kHz标准频率，提高稳定性

    // 多次尝试检查I2C设备
    bool deviceFound = false;
    for (int attempt = 0; attempt < 3; attempt++)
    {
        delay(50); // 每次尝试前稍作延迟
        Wire.beginTransmission(OLED_ADDRESS);
        byte error = Wire.endTransmission();

        if (error == 0)
        {
            deviceFound = true;
            if (DEBUG_SERIAL)
            {
                Serial.printf("I2C设备检测成功，尝试次数: %d\n", attempt + 1);
            }
            break;
        }
        else
        {
            if (DEBUG_SERIAL)
            {
                Serial.printf("I2C设备检测失败，错误代码: %d，尝试次数: %d\n", error, attempt + 1);
            }
        }
    }

    if (!deviceFound)
    {
        if (DEBUG_SERIAL)
        {
            Serial.println("[警告] OLED显示屏初始化失败!");
            Serial.println("请检查:");
            Serial.println("1. SDA引脚15连接是否正常");
            Serial.println("2. SCL引脚16连接是否正常");
            Serial.println("3. OLED显示屏供电是否正常");
            Serial.println("4. I2C地址是否为0x3C");
            Serial.println("系统将继续运行，但无显示功能");
        }
        g_displayInitialized = false;
        return false;
    }

    // 初始化U8g2显示
    if (!u8g2.begin())
    {
        if (DEBUG_SERIAL)
        {
            Serial.println("OLED驱动初始化失败!");
        }
        g_displayInitialized = false;
        return false;
    }

    u8g2.enableUTF8Print();
    u8g2.setFont(u8g2_font_wqy16_t_gb2312);
    u8g2.setDrawColor(1); // 白色

    // 设置初始化成功标志
    g_displayInitialized = true;

    // 显示启动画面
    showSplashScreen();

    if (DEBUG_SERIAL)
    {
        Serial.println("OLED显示屏初始化成功!");
    }

    return true;
}

/**
 * @brief 清除显示屏
 */
void clearDisplay()
{
    u8g2.clearBuffer();
    u8g2.sendBuffer();
}

/**
 * @brief 更新显示内容
 */
void updateDisplay()
{
    u8g2.sendBuffer();
}

/**
 * @brief 设置当前显示页面
 *
 * @param page 页面类型
 */
void setDisplayPage(DisplayPage page)
{
    currentPage = page;
}

/**
 * @brief 获取当前显示页面
 *
 * @return DisplayPage 当前页面类型
 */
DisplayPage getCurrentPage()
{
    return currentPage;
}

/**
 * @brief 显示主页面
 *
 * @param volume 音量值（0-100）
 * @param isNoiseDetected 是否检测到噪声
 */
void showMainPage(uint8_t volume, bool isNoiseDetected)
{
    DISPLAY_SAFE_GUARD();

    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_wqy16_t_gb2312);

    // 第一行：显示音量和噪声状态
    u8g2.setCursor(DISPLAY_LEFT_MARGIN, 20);
    u8g2.print("音量:");
    u8g2.print(volume);
    u8g2.print("%");

    // 在右侧显示噪声状态
    u8g2.setCursor(80, 20);
    if (isNoiseDetected)
    {
        u8g2.print("噪声!");
    }
    else
    {
        u8g2.print("正常");
    }

    // 第二行：显示内存使用情况
    size_t freeHeap = heap_caps_get_free_size(MALLOC_CAP_8BIT);
    size_t totalHeap = heap_caps_get_total_size(MALLOC_CAP_8BIT);
    float usedPercent = 100.0f * (totalHeap - freeHeap) / totalHeap;

    u8g2.setCursor(DISPLAY_LEFT_MARGIN, 40);
    u8g2.print("内存:");
    u8g2.print(usedPercent, 0);
    u8g2.print("%");

    // 第三行：显示CPU使用率
    uint8_t cpuUsage = (uint8_t)getMCUCPUUsage(); // 移除false参数
    u8g2.setCursor(DISPLAY_LEFT_MARGIN, 60);
    u8g2.print("CPU:");
    u8g2.print(cpuUsage);
    u8g2.print("%");

    u8g2.sendBuffer();
}

/**
 * @brief 显示频谱页面
 *
 * @param bandValues 频段值数组
 * @param bands 频段数量
 */
void showSpectrumPage(float *bandValues, uint8_t bands)
{
    DISPLAY_SAFE_GUARD();

    u8g2.clearBuffer();

    // 绘制频谱柱状图
    for (uint8_t i = 0; i < bands; i++)
    {
        uint8_t height = map(bandValues[i], 0, 100, 0, 64);
        u8g2.drawBox(i * 10, 64 - height, 8, height);
    }

    u8g2.sendBuffer();
}

/**
 * @brief 获取菜单项当前值
 *
 * @param index 菜单项索引
 * @return String 当前值的字符串表示
 */
String getMenuItemValue(uint8_t index)
{
    switch (index)
    {
    case 0:
    { // 效果选择
        const char *effectNames[] = {"纯色模式", "彩虹模式", "瀑布模式", "频谱模式", "火焰模式"};
        return (g_config.effectType < 5) ? effectNames[g_config.effectType] : String(g_config.effectType);
    }
    case 1:
    { // 颜色选择
        const char *colorNames[] = {"彩虹色", "火焰色", "海洋色", "森林色", "派对色", "单色", "渐变色"};
        return (g_config.colorScheme < 7) ? colorNames[g_config.colorScheme] : String(g_config.colorScheme);
    }
    case 2:
        return String(g_config.brightness) + "%"; // 亮度调节
    case 3:
        return String(g_config.sensitivity) + "%"; // 音频灵敏度
    case 4:
        return String(g_config.ledStripMode); // 灯带模式
    case 5:
        return String(g_config.segments); // 灯带分段
    case 6:
        return String(g_config.ledsPerSegment); // 每段LED数
    case 7:
        return String(g_config.spectrumSmoothing * 100, 0) + "%"; // 频谱平滑系数
    case 8:
        return String(g_config.riseSpeed * 100, 0) + "%"; // 频谱上升速度
    case 9:
        return String(g_config.fallSpeed * 100, 0) + "%"; // 频谱下降速度
    case 10:
        return String(g_config.peakDecay * 100, 0) + "%"; // 峰值衰减速度
    case 11:
        return String(g_config.peakDotDecay * 100, 0) + "%"; // 峰值点衰减速度
    case 12:
        return String(g_config.peakHoldTime * 100, 0) + "%"; // 峰值点停留时间
    case 13:
        return String(g_config.impactSpeed, 1) + "x"; // 冲击速度
    case 14:
        return String(g_config.maxImpactDistance) + "个LED"; // 最大冲击距离
    case 15:
        return String(g_config.colorCycleTime / (60 * 1000)) + "分钟"; // 颜色循环时间
    case 16:
        return String(g_config.logScale * 100, 0) + "%"; // 对数尺度系数
    case 17:
        return String(g_config.fastDecayRate * 100, 0) + "%"; // 快速衰减率
    case 18:
        return String((int)(g_config.lowFreqComp * 100)) + "%"; // 低频补偿系数
    case 19:
        return String((int)(g_config.midFreqComp * 100)) + "%"; // 中频补偿系数
    case 20:
        return String((int)(g_config.highMidFreqComp * 100)) + "%"; // 中高频补偿系数
    case 21:
        return String((int)(g_config.highFreqComp * 100)) + "%"; // 高频补偿系数
    case 22:
        return String((int)(g_config.lowFreqNoise * 100)) + "%"; // 低频噪声阈值
    case 23:
        return String((int)(g_config.midFreqNoise * 100)) + "%"; // 中频噪声阈值
    case 24:
        return String((int)(g_config.highMidFreqNoise * 100)) + "%"; // 中高频噪声阈值
    case 25:
        return String((int)(g_config.highFreqNoise * 100)) + "%"; // 高频噪声阈值
    case 26:
        return String((int)(g_config.spectrumCompression * 100)) + "%"; // 频谱压缩比例
    case 27:
        return String(g_config.bassBands); // 低频频段数量
    case 28:
        return String(g_config.midBands); // 中频频段数量
    case 29:
        return String(g_config.highBands); // 高频频段数量
    case 30:
        return String(g_config.beatSensitivity); // 节拍灵敏度
    case 31:
        return String((int)(g_config.beatThreshold * 100)) + "%"; // 节拍阈值
    case 32:
        return String((int)(g_config.beatDecayRate * 100)) + "%"; // 节拍衰减率
    case 33:
        return String(g_config.beatMinInterval) + "ms"; // 最小节拍间隔
    case 34:
        return String((int)(g_config.beatBoostFactor * 100)) + "%"; // 节拍增强因子
    case 35:
        if (g_config.freqUpperLimit == 0)
        {
            return "20kHz"; // 显示默认值
        }
        return String(g_config.freqUpperLimit) + "kHz"; // 频率上限
    case 36:
        // 峰值点数量 - 使用通用数值显示模板，不特殊处理"关闭"
        return String(g_config.peakDotCount) + "个";
    case 37:
        switch (g_config.peakDotColor)
        {
        case 0:
            return "七彩";
        case 1:
            return "红色";
        case 2:
            return "绿色";
        case 3:
            return "蓝色";
        case 4:
            return "黄色";
        case 5:
            return "白色";
        case 6:
            return "紫色";
        case 7:
            return "青色";
        case 8:
            return "橙色";
        case 9:
            return "粉色";
        default:
            return "未知";
        }
    case 38:
        return ""; // 保存设置
    case 39:
        return ""; // 恢复默认
    case 40:
        return ""; // 重置设置
    case 41:
        return ""; // 关于
    default:
        return "";
    }
}

/**
 * @brief 显示设置页面
 *
 * @param selectedItem 当前选中的菜单项
 */
void showSettingsPage(uint8_t selectedItem)
{
    DISPLAY_SAFE_GUARD();
    u8g2.clearBuffer();

    if (currentMenuLevel == MENU_LEVEL_CATEGORY)
    {
        // 显示一级菜单（分类菜单）
        drawCategoryList();
    }
    else
    {
        // 显示二级菜单（具体项目菜单）
        drawItemList();
    }

    u8g2.sendBuffer();
}

/**
 * @brief 绘制分类菜单列表
 */
void drawCategoryList()
{
    uint8_t yPos = DISPLAY_START_Y;
    uint8_t endCategory = std::min<uint8_t>(firstVisibleCategory + DISPLAY_MAX_LINES, MENU_CATEGORY_COUNT);
    for (uint8_t i = firstVisibleCategory; i < endCategory; i++) {
        if (i == selectedCategory) {
            u8g2.setDrawColor(1);
            u8g2.drawBox(DISPLAY_LEFT_MARGIN - DISPLAY_HIGHLIGHT_PAD, yPos + HIGHLIGHT_TOP_OFFSET, SCREEN_WIDTH - 2 * DISPLAY_HIGHLIGHT_PAD, DISPLAY_HIGHLIGHT_H);
            u8g2.setDrawColor(0);
            // 绘制文件夹图标（简单矩形+盖子）
            int iconX = DISPLAY_LEFT_MARGIN;
            int iconY = yPos + (DISPLAY_HIGHLIGHT_H + u8g2.getDescent() - u8g2.getAscent()) / 2 - 8;
            u8g2.drawFrame(iconX, iconY, 12, 10); // 文件夹主体
            u8g2.drawBox(iconX, iconY - 3, 8, 4); // 文件夹盖子
            // 菜单文字右移
            u8g2.setCursor(DISPLAY_LEFT_MARGIN + 16, yPos + (DISPLAY_HIGHLIGHT_H + u8g2.getDescent() - u8g2.getAscent()) / 2);
            u8g2.print(menuCategories[i].title);
            u8g2.print(" >");
            u8g2.setDrawColor(1);
        } else {
            // 绘制文件夹图标（非高亮）
            int iconX = DISPLAY_LEFT_MARGIN;
            int iconY = yPos + (DISPLAY_HIGHLIGHT_H + u8g2.getDescent() - u8g2.getAscent()) / 2 - 8;
            u8g2.drawFrame(iconX, iconY, 12, 10);
            u8g2.drawBox(iconX, iconY - 3, 8, 4);
            u8g2.setCursor(DISPLAY_LEFT_MARGIN + 16, yPos + (DISPLAY_HIGHLIGHT_H + u8g2.getDescent() - u8g2.getAscent()) / 2);
            u8g2.print(menuCategories[i].title);
            u8g2.print(" >");
        }
        yPos += DISPLAY_LINE_HEIGHT;
    }
}

void drawItemList()
{
    uint8_t yPos = DISPLAY_START_Y;
    uint8_t itemCount = menuCategories[selectedCategory].itemCount;
    uint8_t firstItemIndex = menuCategories[selectedCategory].firstItemIndex;
    uint8_t endItem = std::min<uint8_t>(firstVisibleItemInCategory + DISPLAY_MAX_LINES, itemCount);
    for (uint8_t i = firstVisibleItemInCategory; i < endItem; i++)
    {
        uint8_t actualItemIndex = firstItemIndex + i;
        if (i == selectedItemInCategory)
        {
            u8g2.setDrawColor(1);
            // 高亮框Y坐标统一用HIGHLIGHT_TOP_OFFSET
            u8g2.drawBox(DISPLAY_LEFT_MARGIN - DISPLAY_HIGHLIGHT_PAD, yPos + HIGHLIGHT_TOP_OFFSET, SCREEN_WIDTH - 2 * DISPLAY_HIGHLIGHT_PAD, DISPLAY_HIGHLIGHT_H);
            u8g2.setDrawColor(0);
            u8g2.setCursor(DISPLAY_LEFT_MARGIN, yPos + (DISPLAY_HIGHLIGHT_H + u8g2.getDescent() - u8g2.getAscent()) / 2);
            u8g2.print(reorganizedMenuItems[actualItemIndex].title);
            String value = getReorganizedMenuItemValue(actualItemIndex);
            if (value.length() > 0)
            {
                u8g2.print(": ");
                u8g2.print(value);
            }
            u8g2.setDrawColor(1);
        }
        else
        {
            u8g2.setCursor(DISPLAY_LEFT_MARGIN, yPos + (DISPLAY_HIGHLIGHT_H + u8g2.getDescent() - u8g2.getAscent()) / 2);
            u8g2.print(reorganizedMenuItems[actualItemIndex].title);
            String value = getReorganizedMenuItemValue(actualItemIndex);
            if (value.length() > 0)
            {
                u8g2.print(": ");
                u8g2.print(value);
            }
        }
        yPos += DISPLAY_LINE_HEIGHT;
    }
}

/**
 * @brief 显示关于页面
 */
void showAboutPage()
{
    DISPLAY_SAFE_GUARD();

    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_wqy16_t_gb2312);

    u8g2.setCursor(DISPLAY_LEFT_MARGIN, 20);
    u8g2.print("FFT音乐频谱");

    u8g2.setCursor(DISPLAY_LEFT_MARGIN, 40);
    u8g2.print("版本: v1.0");

    u8g2.setCursor(DISPLAY_LEFT_MARGIN, 60);
    u8g2.print("二级菜单系统");

    u8g2.sendBuffer();
}

/**
 * @brief 初始化菜单系统
 */
void initMenuSystem()
{
    // 初始化一级菜单
    currentMenuLevel = MENU_LEVEL_CATEGORY;
    firstVisibleCategory = 0;
    selectedCategory = 0;

    // 初始化二级菜单
    firstVisibleItemInCategory = 0;
    selectedItemInCategory = 0;

    // 其他必要的初始化操作
    // ...
}

/**
 * @brief 进入下一级菜单
 */
void enterSubMenu()
{
    if (currentMenuLevel == MENU_LEVEL_CATEGORY)
    {
        // 从一级菜单进入二级菜单
        currentMenuLevel = MENU_LEVEL_ITEM;
        firstVisibleItemInCategory = 0;
        selectedItemInCategory = 0;
    }
    else
    {
        // 已经在二级菜单，执行默认操作
        // ...
    }
}

/**
 * @brief 返回上一级菜单
 */
void returnToPrevMenu()
{
    if (currentMenuLevel == MENU_LEVEL_ITEM)
    {
        // 从二级菜单返回一级菜单
        currentMenuLevel = MENU_LEVEL_CATEGORY;
        firstVisibleCategory = 0;
        selectedCategory = 0;
    }
    else
    {
        // 已经在一级菜单，执行默认操作
        // ...
    }
}

// 当前菜单层级变量定义
uint8_t currentMenuLevel = MENU_LEVEL_CATEGORY;

// 简单实现 drawMenuList，防止未定义错误，实际可根据需要美化
void drawMenuList(uint8_t firstIdx, uint8_t lastIdx, uint8_t selectedIdx)
{
    uint8_t yPos = DISPLAY_START_Y;

    for (uint8_t i = firstIdx; i < lastIdx; i++)
    {
        if (i == selectedIdx)
        {
            u8g2.setDrawColor(1);
            // 修复高亮框高度，确保完全包围文字
            int16_t highlightY = yPos - u8g2.getAscent() - 3 - HIGHLIGHT_TOP_OFFSET;              // 向上扩展3像素
            int16_t highlightH = u8g2.getAscent() + u8g2.getDescent() + 8; // 总高度增加8像素
            u8g2.drawBox(0, highlightY, SCREEN_WIDTH, highlightH);
            u8g2.setDrawColor(0); // 黑色文字在白色背景上
            u8g2.setCursor(DISPLAY_LEFT_MARGIN, yPos);
            u8g2.print(settingsMenuItems[i]); // 使用settingsMenuItems数组
            // 显示当前值，直接跟在菜单名称后面
            String value = getMenuItemValue(i);
            if (value.length() > 0)
            {
                u8g2.print(": "); // 添加冒号和空格作为间隔符
                u8g2.print(value);
            }
            u8g2.setDrawColor(1); // 恢复白色
        }
        else
        {
            u8g2.setCursor(DISPLAY_LEFT_MARGIN, yPos);
            u8g2.print(settingsMenuItems[i]); // 使用settingsMenuItems数组
            // 显示当前值，直接跟在菜单名称后面
            String value = getMenuItemValue(i);
            if (value.length() > 0)
            {
                u8g2.print(": "); // 添加冒号和空格作为间隔符
                u8g2.print(value);
            }
        }
        yPos += DISPLAY_LINE_HEIGHT;
    }
}

// 实现 drawParamPage，通用参数页面渲染
void drawParamPage(const char *title, int value, const char *unit, uint8_t percent)
{
    DISPLAY_SAFE_GUARD();
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_wqy16_t_gb2312);

    // 显示标题
    u8g2.setCursor(DISPLAY_LEFT_MARGIN, 20);
    u8g2.print(title);

    // 显示进度条
    u8g2.drawFrame(DISPLAY_LEFT_MARGIN, 30, 100, 10);
    u8g2.drawBox(DISPLAY_LEFT_MARGIN, 30, percent, 10);

    // 显示当前值
    u8g2.setCursor(DISPLAY_LEFT_MARGIN, DISPLAY_LINE_HEIGHT * 3);
    u8g2.print("当前:");
    u8g2.print(value);
    if (unit && strlen(unit) > 0)
    {
        u8g2.print(unit);
    }

    u8g2.sendBuffer();
}

// 自动化参数页面渲染：统一入口，根据 reorganizedMenuItems 自动调用 drawParamPage
void showParamPage(uint8_t menuIdx)
{
    // 使用二级菜单系统的菜单项索引
    if (menuIdx >= TOTAL_REORGANIZED_MENU_ITEMS)
    {
        return; // 防止越界
    }

    const char *title = reorganizedMenuItems[menuIdx].title; // 使用reorganizedMenuItems数组
    String valueStr = getReorganizedMenuItemValue(menuIdx);  // 使用重新组织的值获取函数
    int value = 0;
    uint8_t percent = 0;
    const char *unit = "";

    // 简单智能解析百分比和单位
    if (valueStr.endsWith("%"))
    {
        value = valueStr.substring(0, valueStr.length() - 1).toInt();
        percent = value;
        unit = "%";
    }
    else if (valueStr.endsWith("个LED"))
    {
        value = valueStr.substring(0, valueStr.length() - 3).toInt();
        percent = map(value, 1, 50, 2, 100); // 假设最大50
        unit = "个LED";
    }
    else if (valueStr.endsWith("ms"))
    {
        value = valueStr.substring(0, valueStr.length() - 2).toInt();
        percent = map(value, 10, 500, 2, 100);
        unit = "ms";
    }
    else if (valueStr.endsWith("分钟"))
    {
        value = valueStr.substring(0, valueStr.length() - 2).toInt();
        percent = map(value, 1, 60, 2, 100);
        unit = "分钟";
    }
    else if (valueStr.endsWith("x"))
    {
        value = valueStr.substring(0, valueStr.length() - 1).toInt();
        percent = map(value, 1, 10, 10, 100);
        unit = "x";
    }
    else if (valueStr.endsWith("kHz"))
    {
        value = valueStr.substring(0, valueStr.length() - 3).toInt();
        percent = map(value, 10, 48, 10, 100);
        unit = "kHz";
    }
    else if (valueStr.endsWith("个"))
    {
        value = valueStr.substring(0, valueStr.length() - 1).toInt();
        percent = map(value, 1, 10, 10, 100);
        unit = "个";
    }
    else
    {
        value = valueStr.toInt();
        percent = map(value, 0, 100, 0, 100);
        unit = "";
    }
    drawParamPage(title, value, unit, percent);
}

/**
 * @brief 显示启动画面
 */
void showSplashScreen()
{
    DISPLAY_SAFE_GUARD();

    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_wqy16_t_gb2312);
    u8g2.setCursor(DISPLAY_LEFT_MARGIN, 20);
    u8g2.print("FFT音乐频谱");
    u8g2.setCursor(DISPLAY_LEFT_MARGIN, 40);
    u8g2.print("初始化中...");
    u8g2.sendBuffer();
    delay(1000);
}

/**
 * @brief 显示保存确认页面
 *
 * @param saving 是否正在保存
 */
void showSavingPage(bool saving)
{
    DISPLAY_SAFE_GUARD();

    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_wqy16_t_gb2312);

    u8g2.setCursor(DISPLAY_LEFT_MARGIN, 30);
    if (saving)
    {
        u8g2.print("保存中...");
    }
    else
    {
        u8g2.print("保存成功!");
    }

    u8g2.sendBuffer();
}

/**
 * @brief 显示重置确认页面
 *
 * @param resetting 是否正在重置
 */
void showResettingPage(bool resetting)
{
    DISPLAY_SAFE_GUARD();

    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_wqy16_t_gb2312);

    u8g2.setCursor(DISPLAY_LEFT_MARGIN, 20);
    if (resetting)
    {
        u8g2.print("正在重置...");
    }
    else
    {
        u8g2.print("重置完成!");
    }

    u8g2.setCursor(DISPLAY_LEFT_MARGIN, 40);
    if (resetting)
    {
        u8g2.print("请稍候");
    }
    else
    {
        u8g2.print("系统重启中");
    }

    u8g2.sendBuffer();
}

/**
 * @brief 显示效果选择页面
 *
 * @param selectedEffect 当前选中的效果
 */
void showEffectSelectPage(LEDEffectMode selectedEffect)
{
    DISPLAY_SAFE_GUARD();

    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_wqy16_t_gb2312);

    // 动态调整可见项起始位置
    if ((uint8_t)selectedEffect < firstVisibleSubMenuItem)
    {
        firstVisibleSubMenuItem = (uint8_t)selectedEffect;
    }
    else if ((uint8_t)selectedEffect >= firstVisibleSubMenuItem + DISPLAY_MAX_LINES)
    {
        firstVisibleSubMenuItem = (uint8_t)selectedEffect - DISPLAY_MAX_LINES + 1;
    }

    // 显示效果列表
    uint8_t yPos = DISPLAY_START_Y;
    uint8_t endItem = std::min((uint8_t)(firstVisibleSubMenuItem + DISPLAY_MAX_LINES), (uint8_t)5);

    for (uint8_t i = firstVisibleSubMenuItem; i < endItem; i++)
    {
        if (i == (uint8_t)selectedEffect)
        {
            // 选中项高亮效果
            u8g2.setDrawColor(1);
            int16_t highlightY = yPos + HIGHLIGHT_TOP_OFFSET;
            int16_t highlightH = DISPLAY_HIGHLIGHT_H;
            u8g2.drawBox(DISPLAY_LEFT_MARGIN - DISPLAY_HIGHLIGHT_PAD, highlightY, SCREEN_WIDTH - 2 * DISPLAY_HIGHLIGHT_PAD, highlightH);
            u8g2.setDrawColor(0);
            u8g2.setCursor(DISPLAY_LEFT_MARGIN, yPos);
            u8g2.print(effectNames[i]);
            u8g2.setDrawColor(1);
        }
        else
        {
            u8g2.setCursor(DISPLAY_LEFT_MARGIN, yPos);
            u8g2.print(effectNames[i]);
        }
        yPos += DISPLAY_LINE_HEIGHT;
    }

    u8g2.sendBuffer();
}

/**
 * @brief 显示颜色选择页面
 *
 * @param selectedColor 当前选中的颜色方案
 */
void showColorSelectPage(uint8_t selectedColor)
{
    DISPLAY_SAFE_GUARD();

    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_wqy16_t_gb2312);

    // 动态调整可见项起始位置
    if (selectedColor < firstVisibleSubMenuItem)
    {
        firstVisibleSubMenuItem = selectedColor;
    }
    else if (selectedColor >= firstVisibleSubMenuItem + DISPLAY_MAX_LINES)
    {
        firstVisibleSubMenuItem = selectedColor - DISPLAY_MAX_LINES + 1;
    }

    // 显示颜色方案列表
    uint8_t yPos = DISPLAY_START_Y;
    uint8_t endItem = std::min((uint8_t)(firstVisibleSubMenuItem + DISPLAY_MAX_LINES), (uint8_t)7);

    for (uint8_t i = firstVisibleSubMenuItem; i < endItem; i++)
    {
        if (i == selectedColor)
        {
            // 选中项高亮效果
            u8g2.setDrawColor(1);
            int16_t highlightY = yPos + HIGHLIGHT_TOP_OFFSET;
            int16_t highlightH = DISPLAY_HIGHLIGHT_H;
            u8g2.drawBox(DISPLAY_LEFT_MARGIN - DISPLAY_HIGHLIGHT_PAD, highlightY, SCREEN_WIDTH - 2 * DISPLAY_HIGHLIGHT_PAD, highlightH);
            u8g2.setDrawColor(0);
            u8g2.setCursor(DISPLAY_LEFT_MARGIN, yPos);
            u8g2.print(colorNames[i]);
            u8g2.setDrawColor(1);
        }
        else
        {
            u8g2.setCursor(DISPLAY_LEFT_MARGIN, yPos);
            u8g2.print(colorNames[i]);
        }
        yPos += DISPLAY_LINE_HEIGHT;
    }

    u8g2.sendBuffer();
}

/**
 * @brief 刷新噪声检查显示
 */
void refreshNoiseCheckDisplay()
{
    DISPLAY_SAFE_GUARD();

    // 获取当前噪声检查状态
    bool noiseCheckEnabled = g_config.noiseCheckEnabled;

    // 直接处理噪声检查显示
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_wqy16_t_gb2312);
    u8g2.setCursor(0, 0);
    u8g2.print("噪声检查模式");

    // 显示当前低频噪声阈值作为代表
    u8g2.setCursor(0, 20);
    u8g2.printf("噪声阈值: %d%%", (int)(g_config.lowFreqNoise * 100));

    u8g2.sendBuffer();
}

/**
 * @brief 显示中高频频段数量页面
 *
 * @param bands 中高频段数量值（1-50）
 */
void showHighMidBandsPage(uint8_t bands)
{
    if (!g_displayInitialized)
        return;

    u8g2.clearBuffer();

    // 标题
    u8g2.setFont(u8g2_font_wqy12_t_chinese3);
    u8g2.setCursor(0, 15);
    u8g2.print("中高频段数量");

    // 当前值
    u8g2.setFont(u8g2_font_10x20_tn);
    u8g2.setCursor(0, 40);
    u8g2.printf("%d 段", bands);

    // 频率范围说明
    u8g2.setFont(u8g2_font_6x10_tf);
    u8g2.setCursor(0, 55);
    u8g2.print("2kHz-10kHz");

    // 操作提示
    u8g2.setCursor(70, 55);
    u8g2.print("UP/DOWN调节");

    u8g2.sendBuffer();
}

// 通用菜单显示函数（支持二级菜单结构）
void displayCurrentMenu() {
    DISPLAY_SAFE_GUARD();
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_wqy16_t_gb2312);

    if (currentMenuLevel == MENU_LEVEL_CATEGORY) {
        // 显示一级菜单（分类列表）
        uint8_t yPos = DISPLAY_START_Y;
        uint8_t endCategory = std::min((uint8_t)(firstVisibleCategory + VISIBLE_MENU_ITEMS), (uint8_t)MENU_CATEGORY_COUNT);
        for (uint8_t i = firstVisibleCategory; i < endCategory; i++) {
            if (i == selectedCategory) {
                // 高亮选中分类
                u8g2.setDrawColor(1);
                u8g2.drawBox(5, yPos + HIGHLIGHT_TOP_OFFSET, 118, DISPLAY_HIGHLIGHT_H);
                u8g2.setDrawColor(0);
                u8g2.setCursor(10, yPos);
                u8g2.print(menuCategories[i].title);
                u8g2.setDrawColor(1);
            } else {
                u8g2.setCursor(10, yPos);
                u8g2.print(menuCategories[i].title);
            }
            yPos += DISPLAY_LINE_HEIGHT;
        }
    } else {
        // 显示二级菜单（参数项列表）
        uint8_t yPos = DISPLAY_START_Y;
        uint8_t itemCount = menuCategories[selectedCategory].itemCount;
        uint8_t endItem = std::min((uint8_t)(firstVisibleItemInCategory + VISIBLE_MENU_ITEMS), itemCount);
        for (uint8_t i = firstVisibleItemInCategory; i < endItem; i++) {
            uint8_t actualIndex = menuCategories[selectedCategory].firstItemIndex + i;
            String itemText = String(reorganizedMenuItems[actualIndex].title);
            String valueText = getReorganizedMenuItemValue(actualIndex);
            if (!valueText.isEmpty()) {
                itemText += ":" + valueText;
            }
            if (i == selectedItemInCategory) {
                // 高亮选中项
                u8g2.setDrawColor(1);
                u8g2.drawBox(2, yPos + HIGHLIGHT_TOP_OFFSET, 124, DISPLAY_HIGHLIGHT_H);
                u8g2.setDrawColor(0);
                u8g2.setCursor(5, yPos);
                u8g2.print(itemText);
                u8g2.setDrawColor(1);
            } else {
                u8g2.setCursor(5, yPos);
                u8g2.print(itemText);
            }
            yPos += DISPLAY_LINE_HEIGHT;
        }
    }

    u8g2.sendBuffer();
}

/**
 * @brief 通用参数编辑显示（修复版本）
 */
void displayParameterEdit(uint8_t menuItemIndex, bool isEditing) {
    DISPLAY_SAFE_GUARD();
    
    if (menuItemIndex >= TOTAL_REORGANIZED_MENU_ITEMS) return;
    
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_wqy16_t_gb2312);
    
    // 显示参数名称
    u8g2.setCursor(5, 15);
    u8g2.print(reorganizedMenuItems[menuItemIndex].title);
    
    // 获取当前值
    String valueStr = getReorganizedMenuItemValue(menuItemIndex);
    
    // 显示当前值（居中显示）
    u8g2.setCursor(20, 35);
    if (isEditing) {
        // 编辑状态下闪烁显示
        static bool blink = false;
        blink = !blink;
        if (blink) {
            u8g2.setDrawColor(1);
            u8g2.drawBox(15, 25, 98, 16);
            u8g2.setDrawColor(0);
        }
    }
    u8g2.print(valueStr);
    u8g2.setDrawColor(1);
    
    // 显示操作提示
    u8g2.setCursor(5, 63);
    u8g2.print("↑↓调整");
    
    u8g2.sendBuffer();
}